package br.com.cept.sce.commons.util;

/*
* Criado em: 5/1/2009
* Responsavel: junier
*/

import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Properties;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;

public class MessagesUtil {

	private static InputStream stream = MessagesUtil.class.getResourceAsStream("../../commons/messages/messages.properties");
    private static Properties properties;

    
	/**
	 * Funcao: Recupera a mensagem do application.properties.<br>
	 * Atributos: <code>String</code> key - chave no application.properties<br>
	 * Retorno: <code>String</code> - valor (do application.properties) referente a chave recebida como par�metro.
	 */
	public static String getMensagem(String key) {
		if (properties == null) {
            properties = new Properties();
            if (stream != null) {
                try {
                    properties.load(stream);
                    stream.close();
                } catch (IOException e) {
                	return null;
                }
            }
        }

		if (!properties.containsKey(key)) {
            return "???" + key + "???";
        }
		return properties.getProperty(key);
	}
	
	/**
	 * Funcao: Recupera a mensagen do application.properties.<br>
	 * Atributos: <code>String</code> key - chave no application.properties<br>
	 * 			  <code>String[]</code> parametros - parametros da mensagem<br>
	 * Retorno: <code>String</code> - valor (do application.properties) referente a chave recebida e seus par�metro.
	 */
	public static String getMensagemComParametros(String key, String[] parametros) {
		String mensagem = getMensagem(key);
		for (int i = 0; i < parametros.length; i++) {
			String param = parametros[i];
			String regex = "{" + i + "}";
			mensagem = mensagem.replace(regex, param);
		}
		return mensagem;
	}
	/**
	 * Funcao: Retornar erros de validacao<br>
	 * Atributos: <code>List<String[]></code> key - chave no application.properties e parametros - parametros da mensagem<br>
	 * Retorno: <code>String</code> - valor (do application.properties) referente a chave recebida e seus parametro.
	 */
	//public static String getMensagensComParametros(String key, String[] parametros) {
	public static String getMensagensComParametros(List<String[]> errosCollection) {
		
		String mensagem = "";
		String mensagemKey = null;
		String[] param;
		
		for (String[] erro : errosCollection ) {
			
			int i;
			
			mensagemKey = erro[0];
			param = new String[erro.length-1];
			
			for (i=1; i<erro.length; i++) {
				
				param[i-1] = erro[i];
			}
			
			mensagem += getMensagemComParametros(mensagemKey, param);
			
			if(errosCollection.indexOf(erro) == errosCollection.size()-1) {
				
				break;
			}
			
			mensagem += "\n";
			
						
		}
		
		
		return mensagem;
	}
	/**
	 * Funcao: Recupera a mensagen do application.properties.<br>
	 * Atributos: <code>String</code> key - chave no application.properties<br>
	 * Retorno: <code>FacesMessage</code> - inst�ncia de <code>FacesMessage</code> com a mensagem do application.properties.<br>
	 */
	public static FacesMessage getFacesMsg (String key){
		String mensagem = getMensagem(key);
		return new FacesMessage(mensagem);
	}

	/**
	 * Funcao: Seta a mensagen do application.properties no <code>FacesContext</code>.<br>
	 * Atributos: <code>String</code> key - chave no application.properties
	 */
	public static void setMsgNoFacesCtx (String key){
		String mensagem = getMensagem(key);
		addMessage(mensagem);
	}

	/**
	 * Funcao: Seta a mensagem do application.properties no <code>FacesContext</code>,<br>
	 * 		   substituindo os valores esperados pelos parametros passados.<br>
	 * Atributos: <code>String</code> key - chave no application.properties<br>
	 * 			  <code>String[]</code> parametros - par�metros da mensagem<br>
	 */
	public static void setMsgComParamNoFacesCtx (String key, String[] parametros){
		String mensagem = getMensagemComParametros(key, parametros);
		addMessage(mensagem);
	}

	
	/**
	 * Funcao: Seta a mensagen de sucesso do application.properties no <code>FacesContext</code>.<br>
	 */
	public static void setMsgSucesso (){
		String mensagem = getMensagem("msg_sucesso");
		addMessage(mensagem);
	}
	
	/**
	 * Funcao: adiciona a mensagem no <code>FacesContext.</code>
	 * Atributos: <code>String</code> mensagem - mensagem que ser� adicionada no <code>FacesContext</code>.
	 */
	private static void addMessage(String mensagem) {
		FacesContext ctx = FacesContext.getCurrentInstance();
		ctx.addMessage(null, new FacesMessage(mensagem));
	}

	
}
